Django REST Framework (DRF)์์ serializer๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฒฉ ๊ฐ์ฒด ์ง๋ ฌํ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋. ๋ค์ํ ๊ด๊ณ ์ ํ๊ณผ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ค๋ฃน๋๋ค.
Python DRF Serializer Relations: ์ค์ฒฉ ๊ฐ์ฒด ์ง๋ ฌํ ๋ง์คํฐํ๊ธฐ
Django REST Framework (DRF)๋ ์น API ๊ตฌ์ถ์ ์ํ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์์คํ ์ ์ ๊ณตํฉ๋๋ค. API ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด์ ๋ฐ์ดํฐ ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ฉฐ, DRF serializer๋ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ DRF serializer์์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
Serializer ๊ด๊ณ ์ดํด
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๊ณ๋ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ ๋๋ ๋ชจ๋ธ์ด ์ฐ๊ฒฐ๋๋ ๋ฐฉ์์ ์ ์ํฉ๋๋ค. DRF serializer๋ API ์๋น๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ฅผ JSON ๋๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํ ๋ ์ด๋ฌํ ๊ด๊ณ๋ฅผ ๋ฐ์ํด์ผ ํฉ๋๋ค. ์ธ ๊ฐ์ง ์ฃผ์ ๊ด๊ณ ์ ํ์ ๋ค๋ฃน๋๋ค.
- ForeignKey (์ผ๋๋ค): ๋จ์ผ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ด๋ จ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์๊ฐ๊ฐ ์ฌ๋ฌ ๊ถ์ ์ฑ ์ ์ธ ์ ์์ต๋๋ค.
- ManyToManyField (๋ค๋๋ค): ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ด๋ จ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์๊ฐ๊ฐ ์ฌ๋ฌ ๊ถ์ ์ฑ ์ ๊ณต๋ ์์ ํ ์ ์์ต๋๋ค.
- OneToOneField (์ผ๋์ผ): ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ณ ์ ํ๊ฒ ๊ด๋ จ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ์ ์ข ์ข ์ฌ์ฉ์ ๊ณ์ ๊ณผ ์ผ๋์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
ForeignKey๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ณธ ์ค์ฒฉ ์ง๋ ฌํ
ForeignKey ๊ด๊ณ๋ฅผ ์ง๋ ฌํํ๋ ๊ฐ๋จํ ์์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๋ค์ ๋ชจ๋ธ์ ๊ณ ๋ คํ์ญ์์ค.
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
country = models.CharField(max_length=50, default='USA') # ๊ตญ์ ์ ๋งฅ๋ฝ์ ์ํด ๊ตญ๊ฐ ํ๋ ์ถ๊ฐ
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
publication_date = models.DateField()
def __str__(self):
return self.title
๊ด๋ จ๋ `Author` ๋ฐ์ดํฐ์ ํจ๊ป `Book` ๋ชจ๋ธ์ ์ง๋ ฌํํ๋ ค๋ฉด ์ค์ฒฉ๋ serializer๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
from rest_framework import serializers
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ['id', 'name', 'country']
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True) # PrimaryKeyRelatedField์์ ๋ณ๊ฒฝ๋จ
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
์ด ์์ ์์ `BookSerializer`์๋ `AuthorSerializer` ํ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. `read_only=True`๋ `author` ํ๋๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค์ด ์ฑ ์๋ํฌ์ธํธ๋ฅผ ํตํด ์์ฑ์๋ฅผ ์์ ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์์ฑ์ ์ ๋ณด๊ฐ ์๋ ์ฑ ์ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฐ๊ธฐ ์์ ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค (์๋ ์ฐธ์กฐ).
์ด์ `Book` ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๋ฉด JSON ์ถ๋ ฅ์ ์ฑ ๋ฐ์ดํฐ ๋ด์ ์ค์ฒฉ๋ ์ ์ฒด ์์ฑ์ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
{
"id": 1,
"title": "The Hitchhiker's Guide to the Galaxy",
"author": {
"id": 1,
"name": "Douglas Adams",
"country": "UK"
},
"publication_date": "1979-10-12"
}
ManyToManyField ๊ด๊ณ ์ง๋ ฌํ
`ManyToManyField` ๊ด๊ณ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. `Category` ๋ชจ๋ธ์ด ์๊ณ ์ฑ ์ด ์ฌ๋ฌ ๋ฒ์ฃผ์ ์ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
categories = models.ManyToManyField(Category, related_name='books')
publication_date = models.DateField()
def __str__(self):
return self.title
`serializers.StringRelatedField` ๋๋ `serializers.PrimaryKeyRelatedField`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ฃผ๋ฅผ ์ง๋ ฌํํ๊ฑฐ๋ ์ค์ฒฉ๋ serializer๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name']
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
categories = CategorySerializer(many=True, read_only=True) # ManyToManyField์ many=True๊ฐ ํ์์ ์
๋๋ค.
class Meta:
model = Book
fields = ['id', 'title', 'author', 'categories', 'publication_date']
`many=True` ์ธ์๋ `ManyToManyField`๋ฅผ ์ง๋ ฌํํ ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๋ serializer์๊ฒ ๋ฒ์ฃผ ๊ฐ์ฒด ๋ชฉ๋ก์ ์์ํ๋๋ก ์ง์ํฉ๋๋ค. ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"id": 1,
"title": "Pride and Prejudice",
"author": {
"id": 2,
"name": "Jane Austen",
"country": "UK"
},
"categories": [
{
"id": 1,
"name": "Classic Literature"
},
{
"id": 2,
"name": "Romance"
}
],
"publication_date": "1813-01-28"
}
OneToOneField ๊ด๊ณ ์ง๋ ฌํ
`OneToOneField` ๊ด๊ณ์ ๊ฒฝ์ฐ ์ ๊ทผ ๋ฐฉ์์ ForeignKey์ ์ ์ฌํ์ง๋ง ๊ด๋ จ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
bio = models.TextField(blank=True)
location = models.CharField(max_length=100, blank=True, default='Global') # ๊ตญ์ ์ ๋งฅ๋ฝ์ ์ํด ์์น ์ถ๊ฐ
def __str__(self):
return self.user.username
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ['id', 'bio', 'location']
class UserSerializer(serializers.ModelSerializer):
profile = UserProfileSerializer(read_only=True)
class Meta:
model = User
fields = ['id', 'username', 'email', 'profile']
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"id": 1,
"username": "johndoe",
"email": "john.doe@example.com",
"profile": {
"id": 1,
"bio": "Software Engineer.",
"location": "London, UK"
}
}
์ฐ๊ธฐ ์์ ์ฒ๋ฆฌ (์์ฑ ๋ฐ ์ ๋ฐ์ดํธ)
์์ ์์ ๋ ์ฃผ๋ก ์ฝ๊ธฐ ์ ์ฉ ์ง๋ ฌํ์ ์ค์ ์ ๋ก๋๋ค. ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํ๋ ค๋ฉด serializer์์ `create()` ๋ฐ `update()` ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํฉ๋๋ค.
์ค์ฒฉ๋ ๊ฐ์ฒด ์์ฑ
์ ์ฑ ๊ณผ ์์ฑ์๋ฅผ ๋์์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
def create(self, validated_data):
author_data = validated_data.pop('author')
author = Author.objects.create(**author_data)
book = Book.objects.create(author=author, **validated_data)
return book
`create()` ๋ฉ์๋์์ ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ `Author` ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค์ ์๋ก ๋ง๋ ์์ฑ์์ ์ฐ๊ฒฐํ์ฌ `Book` ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
์ค์: `author_data`์์ ์ ์ฌ์ ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. try-except ๋ธ๋ก์ ์ฌ์ฉํ๊ณ ์์ฑ์ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ `serializers.ValidationError`๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
์ค์ฒฉ๋ ๊ฐ์ฒด ์ ๋ฐ์ดํธ
๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ ๊ณผ ์์ฑ์๋ฅผ ๋ชจ๋ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
def update(self, instance, validated_data):
author_data = validated_data.pop('author', None)
if author_data:
author = instance.author
for attr, value in author_data.items():
setattr(author, attr, value)
author.save()
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()
return instance
`update()` ๋ฉ์๋์์ ๊ธฐ์กด ์์ฑ์๋ฅผ ๊ฒ์ํ๊ณ ์ ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ค์ ์ฑ ์ ์์ฑ์ ์ ๋ฐ์ดํธํฉ๋๋ค. `author_data`๊ฐ ์ ๊ณต๋์ง ์์ ๊ฒฝ์ฐ (์์ฑ์๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์์ ์๋ฏธ) ์ฝ๋๋ ์์ฑ์ ์ ๋ฐ์ดํธ ์น์ ์ ๊ฑด๋๋๋๋ค. `validated_data.pop('author', None)`์ `None` ๊ธฐ๋ณธ๊ฐ์ ์ ๋ฐ์ดํธ ์์ฒญ์ ์์ฑ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
`PrimaryKeyRelatedField` ์ฌ์ฉ
์ค์ฒฉ๋ serializer ๋์ `PrimaryKeyRelatedField`๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ ๊ฐ์ฒด์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ๊ด๋ จ ๊ฐ์ฒด์ ID๋ง ์ฐธ์กฐํด์ผ ํ๊ณ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
class BookSerializer(serializers.ModelSerializer):
author = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all())
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
์ด์ `author` ํ๋์ ์์ฑ์์ ID๊ฐ ํฌํจ๋ฉ๋๋ค.
{
"id": 1,
"title": "1984",
"author": 3, // ์์ฑ์ ID
"publication_date": "1949-06-08"
}
์์ฑ ๋ฐ ์ ๋ฐ์ดํธ์ ๊ฒฝ์ฐ ์์ฒญ ๋ฐ์ดํฐ์ ์์ฑ์์ ID๋ฅผ ์ ๋ฌํฉ๋๋ค. `queryset=Author.objects.all()`์ ์ ๊ณต๋ ID๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ง ํ์ธํฉ๋๋ค.
`HyperlinkedRelatedField` ์ฌ์ฉ
`HyperlinkedRelatedField`๋ ๊ด๋ จ ๊ฐ์ฒด์ API ์๋ํฌ์ธํธ์ ๋ํ ํ์ดํผ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ํ์ดํผ๋ฏธ๋์ด API (HATEOAS)์์ ์ผ๋ฐ์ ์ ๋๋ค.
class BookSerializer(serializers.ModelSerializer):
author = serializers.HyperlinkedRelatedField(view_name='author-detail', read_only=True)
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
`view_name` ์ธ์๋ ๊ด๋ จ ๊ฐ์ฒด์ ๋ํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ทฐ์ ์ด๋ฆ (์: `author-detail`)์ ์ง์ ํฉ๋๋ค. `urls.py`์์ ์ด ๋ทฐ๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค.
์ถ๋ ฅ์๋ ์์ฑ์์ ์ธ๋ถ ์ ๋ณด ์๋ํฌ์ธํธ๋ฅผ ๊ฐ๋ฆฌํค๋ URL์ด ํฌํจ๋ฉ๋๋ค.
{
"id": 1,
"title": "Brave New World",
"author": "http://example.com/api/authors/4/",
"publication_date": "1932-01-01"
}
๊ณ ๊ธ ๊ธฐ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
- `depth` ์ต์ : `ModelSerializer`์์ `depth` ์ต์ ์ ์ฌ์ฉํ์ฌ ํน์ ๊น์ด๊น์ง ForeignKey ๊ด๊ณ์ ๋ํ ์ค์ฒฉ๋ serializer๋ฅผ ์๋์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ `depth`๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๊ณ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก serializer๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- `SerializerMethodField`: `SerializerMethodField`๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ ๋ฐ์ดํฐ์ ๋ํ ์ฌ์ฉ์ ์ง์ ์ง๋ ฌํ ๋ ผ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ํน์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํฌ๋งทํ๊ฑฐ๋ ๊ณ์ฐ๋ ๊ฐ์ ํฌํจํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก์ผ์ผ์ ๊ธฐ์ค์ผ๋ก ์์ฑ์์ ์ ์ฒด ์ด๋ฆ์ ๋ค๋ฅธ ์์๋ก ํ์ํ ์ ์์ต๋๋ค. ๋ง์ ์์์ ๋ฌธํ๊ถ์์๋ ์ฑ์ด ์ด๋ฆ๋ณด๋ค ๋จผ์ ๋์ต๋๋ค.
- ํํ ์ฌ์ฉ์ ์ง์ : serializer์์ `to_representation()` ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ํํ๋๋ ๋ฐฉ์์ ์ฌ์ฉ์ ์ง์ ํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๋ณต์กํ ๊ด๊ณ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ select_related ๋ฐ prefetch_related์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํธ ์๋ฅผ ์ค์ ๋๋ค. ์ด๋ ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆด ์ ์๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ API์ ํนํ ์ค์ํฉ๋๋ค.
- Null ๊ฐ ์ฒ๋ฆฌ: ํนํ ์ ํ์ ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ ๋ serializer์์ null ๊ฐ์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ ์ํ์ญ์์ค. ํ์ํ ๊ฒฝ์ฐ serializer ํ๋์์ `allow_null=True`๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ ํจ์ฑ ๊ฒ์ฌ: ํนํ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ ๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๊ท์น์ ์ ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ฑ ์ ๋ฐํ์ผ์ ๋ฏธ๋๊ฐ ์๋์ด์ผ ํฉ๋๋ค.
- ๊ตญ์ ํ ๋ฐ ์ง์ญํ (i18n/l10n): ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์ธ์ด์ ์ง์ญ์์ ์ด๋ป๊ฒ ํ์๋๋์ง ๊ณ ๋ คํ์ญ์์ค. ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๋ง๊ฒ ๋ ์ง, ์ซ์ ๋ฐ ํตํ๋ฅผ ์ ์ ํ๊ฒ ํฌ๋งทํ์ญ์์ค. ๋ชจ๋ธ ๋ฐ serializer์ ๊ตญ์ ํ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ์ ์ฅํ์ญ์์ค.
Serializer ๊ด๊ณ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก
- Serializer๋ฅผ ์ง์ค์ ์ผ๋ก ์ ์ง: ๊ฐ serializer๋ ํน์ ๋ชจ๋ธ ๋๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ฐ์ดํฐ ์งํฉ์ ์ง๋ ฌํํ๋ ์ญํ ์ ํด์ผ ํฉ๋๋ค. ์ง๋์น๊ฒ ๋ณต์กํ serializer๋ฅผ ๋ง๋ค์ง ๋ง์ญ์์ค.
- ๋ช ์์ Serializer ์ฌ์ฉ: `depth` ์ต์ ์ ๋๋ฌด ๋ง์ด ์์กดํ์ง ๋ง์ญ์์ค. ์ง๋ ฌํ ํ๋ก์ธ์ค๋ฅผ ๋ ์ ์ ์ดํ๊ธฐ ์ํด ๊ฐ ๊ด๋ จ ๋ชจ๋ธ์ ๋ํด ๋ช ์์ serializer๋ฅผ ์ ์ํ์ญ์์ค.
- ์ฒ ์ ํ๊ฒ ํ ์คํธ: serializer๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค. ํนํ ๋ณต์กํ ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ ๋ ๊ทธ๋ ์ต๋๋ค.
- API ๋ฌธ์ํ: API ์๋ํฌ์ธํธ์ ์์ํ๊ณ ๋ฐํํ๋ ๋ฐ์ดํฐ ํ์์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. Swagger ๋๋ OpenAPI์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํํ API ๋ฌธ์๋ฅผ ์์ฑํ์ญ์์ค.
- API ๋ฒ์ ๊ด๋ฆฌ ๊ณ ๋ ค: API๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ธฐ์กด ํด๋ผ์ด์ธํธ์์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ฅผ ํตํด ์ด์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: API์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ serializer ๊ด๊ณ์ ๊ด๋ จ๋ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค. ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๋ฐ ์ง๋ ฌํ ๋ ผ๋ฆฌ๋ฅผ ์ต์ ํํ์ญ์์ค.
๊ฒฐ๋ก
Django REST Framework์์ serializer ๊ด๊ณ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์น API๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ค์ํ ์ ํ์ ๊ด๊ณ์ DRF serializer์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ต์ ์ ์ดํดํจ์ผ๋ก์จ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ๊ณ , ์ฐ๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ณ , ์ฑ๋ฅ์ ์ํด API๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. API๊ฐ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ก์ธ์คํ ์ ์๋๋ก API๋ฅผ ์ค๊ณํ ๋ ๊ตญ์ ํ ๋ฐ ์ง์ญํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ฒ ์ ํ ํ ์คํธ์ ๋ช ํํ ๋ฌธ์๋ API์ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ๊ณผ ์ ์ฉ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํต์ฌ์ ๋๋ค.